#include "Sql_list.h"

// 顺序表的初始化
Sql_list *Init_Sql_List(int max)
{
    if (0 >= max)
    {
        printf("创建的空间太小了\n");
        return NULL;
    }

    // 创建动态空间
    Sql_list *L = (Sql_list *)malloc(sizeof(Sql_list));
    if (NULL == L)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }
    L->data = (Elenemt_data *)malloc(max * sizeof(Elenemt_data));
    if (NULL == L->data)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }
    L->len = 0;
    L->max = max;

    return L;
}

// 顺序表的插入
int tail_insert_tail(Sql_list *L, Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("顺序表 空间 为 NULL \n");
        return EOF;
    }
    if (L->max <= L->len)
    {
        printf("顺序表 为 满 \n");
        return EOF;
    }

    // 插入
    L->data[L->len] = data;
    // 迭代
    L->len++;
}

// 顺序表的遍历
void printf_Sql_List(Sql_list *L)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (NULL == L->data)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }

    for (size_t i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
               L->data[i].name, L->data[i].sex, L->data[i].age,
               L->data[i].sco, L->data[i].id);
    }
}

// 顺序表的扩容
Elenemt_data *Expand_Sql_List(Sql_list *L, int num)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (NULL == L->data)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (num == L->max)
    {
        printf("无操作\n");
        return NULL;
    }

    // 1 为新数据创建空间
    Elenemt_data *new_data = (Elenemt_data *)malloc(num * sizeof(Elenemt_data));


    // 缩容 的 判断
    if (num < L->len)
    {
        char ch = 0;
        printf("新空间 不能 全部存放原来的数据 是否继续执行(Y:继续 N:不继续)");
        scanf("%c" , ch);
        if ('N' == ch)
        {
            free(new_data); // 创建空间未释放
            return NULL;
        }
        L->len = num;
        // L->len = 5
        // num = 2
    }
    

    // 2 为新数据空间 写入 数据
    for (size_t i = 0; i < L->len; i++)
    {
        new_data[i] = L->data[i];
    }

    // 3 释放原空间
    free(L->data);

    // 4 将 表的 data 指向 新空间
    L->data = new_data;

    // 5 修改 max 的值
    L->max = num;

    // 6 返回 新数据的地址
    return new_data;
}

// 顺序表的销毁
void Destroy_Sql_List(Sql_list **L)
{
    if (NULL == *L)
    {
        printf("表为 NULL\n");
        return;
    }
    if (NULL == (*L)->data)
    {
        printf("表为 NULL\n");
        return;
    }

    // 先销毁数据
    free((*L)->data);
    (*L)->data = NULL;

    // 销毁表
    free(*L);
    *L = NULL;
}
